const crypto = require("crypto");

/**
 * 将URL参数字符串转换为对象
 * @param {string} queryString - URL参数字符串
 * @returns {Object} 参数对象
 */
function parseQueryString(queryString) {
  if (!queryString) return {};

  return queryString.split("&").reduce((params, param) => {
    const [key, value] = param.split("=");
    params[key] = value;
    return params;
  }, {});
}

/**
 * 生成MD5签名
 * @param {Object|string} params - 参数对象或URL参数字符串
 * @returns {string} MD5签名
 */
function generateSignatureMD5(params) {
  // 如果传入的是字符串，则解析为对象
  const paramsObj =
    typeof params === "string" ? parseQueryString(params) : params;

  // 1. 按照字母顺序排列参数
  const orderedParams = {};
  Object.keys(paramsObj)
    .sort()
    .forEach((key) => {
      orderedParams[key] = paramsObj[key];
    });

  // 2. 拼接 key=value 字符串
  const kvPairs = Object.entries(orderedParams).map(([key, value]) => {
    if (typeof value === "object") value = JSON.stringify(value);
    return `${key}=${value}`;
  });

  // 3. 拼接字符串并加密钥
  const str =
    kvPairs.join("&").toLowerCase() + "053ef899Af294A36bB5ae1730c7995E8";
  console.log("签名前的字符串：", str);

  // 4. 计算 MD5
  return crypto.createHash("md5").update(str).digest("hex");
}

// 示例：使用URL参数字符串
// const queryString =
//   "pageindex=0&pagesize=30&albumID=152442&userID=6562963&timeStamp=1745929920643";
const queryString =
  "pageindex=0&pagesize=30&categoryID=1&timeStamp=1745930673256";
const secret = "053ef899Af294A36bB5ae1730c7995E8";

// 测试URL参数字符串
const signature = generateSignatureMD5(queryString, secret);
console.log("URL参数字符串生成的签名：", signature);

// 打印完整的请求参数
function getFullParams(params, signature) {
  const paramsObj =
    typeof params === "string" ? parseQueryString(params) : params;
  return {
    ...paramsObj,
    SignatureMD5: signature,
  };
}

console.log(
  "完整请求参数：",
  Object.entries(getFullParams(queryString, signature))
    .map(([k, v]) => `${k}=${v}`)
    .join("&")
);
